<?php
/**
 * Service_Declination
 *
 * Класс Service_Declination отвечает за склонения слов и фраз
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
class Service_Declination {

	
  /**
   * Получает родительный падеж слова/словосочетания
   * 
   * @param string $strWord - слово/словосочетания, которое надо просклонять
   * 
   *  @return string
   */	
	public static function getGenitive($strWord) {
	  if (strpos($strWord, ' ')) { // Если словосочетание (есть пробелы)
	    $arrWords = explode(' ', $strWord);
	    $retStr = '';
	    foreach ($arrWords as $word) {
	    	if (!empty($retStr)) $retStr .= ' ';
	    	$retStr .= self::getGenitive($word);
	    }
	    return $retStr;
	  }
		switch ($strWord) {
	  	case 'Ростов-на-Дону': return 'Ростова-на-Дону';
	  	default:
	  		$wordLength = Service_Function::utf8_strlen($strWord);
			  $lastLetter = Service_Function::utf8_substr($strWord, $wordLength - 1);
			  $strWordWithoutLetter = Service_Function::utf8_substr($strWord, 0, $wordLength - 1);
			  switch ($lastLetter) {
  				// Обрабатываемый алфафит
  				//авгджкрья
			  	case 'а':
						return $strWordWithoutLetter . 'ы';
					case 'в': case 'г': case 'д': case 'ж': case 'к': case 'р':
						return $strWord . 'а';
					case 'ь':
						return $strWordWithoutLetter . 'и';
					case 'я':
			  		$lastLetters = Service_Function::utf8_substr($strWord, $wordLength - 2);
						$strWordWithoutLetters = Service_Function::utf8_substr($strWord, 0, $wordLength - 2);
						switch ($lastLetters) {
							case 'ая': return  $strWordWithoutLetters . 'ой';
							default: return $strWordWithoutLetter . 'и';
						}						
					case 'й':
						$lastLetters = Service_Function::utf8_substr($strWord, $wordLength - 2);
						$strWordWithoutLetters = Service_Function::utf8_substr($strWord, 0, $wordLength - 2);
						switch ($lastLetters) {
							case 'ий': return  $strWordWithoutLetters . 'его';
							default: return $strWord;
						}
					default: return $strWord;
			  }
	  		break;
	  }	
	}
	
	public static function getDative() {
		
	}
	
	public static function getAccusative() {
		
	}
	
	public static function getAblative() {
		
	}
	
	public static function getPrepositional($strWord) {
	  if (strpos($strWord, ' ')) { // Если словосочетание (есть пробелы)
	    $arrWords = explode(' ', $strWord);
	    $retStr = '';
	    foreach ($arrWords as $word) {
	    	if (!empty($retStr)) $retStr .= ' ';
	    	$retStr .= self::getGenitive($word);
	    }
	    return $retStr;
	  }
		switch ($strWord) {
	  	case 'Ростов-на-Дону': return 'Ростове-на-Дону';
	  	default:
	  		$wordLength = Service_Function::utf8_strlen($strWord);
			  $lastLetter = Service_Function::utf8_substr($strWord, $wordLength - 1);
			  $strWordWithoutLetter = Service_Function::utf8_substr($strWord, 0, $wordLength - 1);
			  switch ($lastLetter) {
  				// Обрабатываемый алфафит
  				//авгджкрья
			  	case 'а':
						return $strWordWithoutLetter . 'е';
					case 'в': case 'г': case 'д': case 'ж': case 'к': case 'н': case 'р':
						return $strWord . 'е';
					case 'ь':
						return $strWordWithoutLetter . 'и';
					case 'я':
			  		$lastLetters = Service_Function::utf8_substr($strWord, $wordLength - 2);
						$strWordWithoutLetters = Service_Function::utf8_substr($strWord, 0, $wordLength - 2);
						switch ($lastLetters) {
							case 'ая': return  $strWordWithoutLetters . 'ой';
							default: return $strWordWithoutLetter . 'и';
						}						
					case 'й':
						$lastLetters = Service_Function::utf8_substr($strWord, $wordLength - 2);
						$strWordWithoutLetters = Service_Function::utf8_substr($strWord, 0, $wordLength - 2);
						switch ($lastLetters) {
							case 'ий': return  $strWordWithoutLetters . 'ем';
							default: return $strWord;
						}
					default: return $strWord;
			  }
	  		break;
	  }	
	}
	
	/**
   * Определяем склоенение
   *
   * @param array $number - число для которого ищем склонение
   */
	public static function getAmountDeclination($number) {
		$number = $number % 100;
		if (($number > 10) && ($number < 20)) return 1; // Родительный, множественное число
		else{
			switch ($number % 10) {
				case 1: return 2; // Именительный, единственное число
				case 2:	case 3:	case 4:	return 3; // Именительный, множественное число
				case 5: case 6:	case 7:	case 8:	case 9:	case 0:	return 1; // Родительный, множественное число
				default: return 1;
			}
		}
	}
	
	/**
	 * Склонение лет
	 *
	 * @param $number - число
	 * @return
	 */
	public static function getYearsDeclension($number) {
		switch (self::getAmountDeclination($number)) {
			case 1: return ' лет ';
			case 2: return ' год ';
			case 3:	return ' года ';
		}
	}
	
	/**
	 * Склонение ночей
	 *
	 * @param $number - число
	 * @return
	 */
	public static function getNightsDeclension($number) {
		if (Service_Translate::getLang() == 'en') {
			if ($number > 1) return ' nights ';
			else return ' night ';
		}
		switch (self::getAmountDeclination($number)) {
			case 1: return ' ночей ';
			case 2: return ' ночь ';
			case 3:	return ' ночи ';
		}
	}

}
?>